package model.prestamos.estado;

import model.prestamos.Prestamo;
import excepciones.prestamos.NoSePuedeAprobarPrestamoException;
import excepciones.prestamos.NoSePuedeCobrarCuotaException;
import excepciones.prestamos.NoSePuedePasarPrestamoADeudorIncobrableException;
import excepciones.prestamos.NoSePuedePasarPrestamoAEnDeudaException;
import excepciones.prestamos.NoSePuedeRechazarPrestamoException;

/**
 * @author Lucas
 */
public abstract class EstadoPrestamo {

	/**
	* Se paga la primer cuota no paga del prestamo. Si es la ultima cuota del prestamo este pasa a estado Finalizado.
	* @param prestamo al cual se quiere pagar la cuota
	* @throws NoSePuedeCobrarCuotaException si el prestamo no esta en condiciones de recibir un pago (ej. Finalizado)
	*/
	public void cobrarCuota(Prestamo prestamo) throws NoSePuedeCobrarCuotaException{
		throw new NoSePuedeCobrarCuotaException("No se puede cobrar la cuota de un prestamo que no este en curso, en deuda o en deuda incobrable");
	}
	
	/**
	 * Rechaza un prestamo por un motivo a explicar
	 * @param prestamo a rechazar
	 * @param motivo del rechazo
	 * @throws NoSePuedeRechazarPrestamoException si el prestamo no esta en condiciones de ser rechazado (ej. un prestamo ya rechazado)
	 */
	public void rechazar(Prestamo prestamo , String motivo) throws NoSePuedeRechazarPrestamoException{
		throw new NoSePuedeRechazarPrestamoException("No se puede rechazar un prestamo que no este solicitado");
	}
	
	/**
	 * El empleado decide cuando un prestamo es marcado como "en deuda".
	 * @param prestamo a pasar a en deuda
	 * @throws NoSePuedePasarPrestamoAEnDeudaException si el prestamo no esta en curso
	 */
	public void pasarPrestamoAEnDeuda(Prestamo prestamo) throws NoSePuedePasarPrestamoAEnDeudaException{
		throw new NoSePuedePasarPrestamoAEnDeudaException("No se puede pasar un presamo a en deuda si no esta en curso");
	}
	
	/**
	 * El empleado decide cuando un prestamo es marcado como "deudor incobrable".
	 * Un prestamo en este estado ya no puede ser pagado, se considera que el cliente jamas va a saldar su deuda.
	 * @param prestamo a pasar a deudor incobrable
	 * @throws NoSePuedePasarPrestamoADeudorIncobrableException cuando el prestamo no esta en deuda
	 */
	public void pasarPrestamoADeudorIncobrable(Prestamo prestamo) throws NoSePuedePasarPrestamoADeudorIncobrableException{
		throw new NoSePuedePasarPrestamoADeudorIncobrableException("No se puede pasar un prestamo a deudor incobrable si no esta en deuda");
	}
	
	/**
	 * Aprueba un prestamo solicitado, cambiando su estado a prestamo en curso
	 * @param prestamo a aprobar
	 * @throws NoSePuedeAprobarPrestamoException si el prestamo no esta solicitado
	 */
	public void aprobar(Prestamo prestamo) throws NoSePuedeAprobarPrestamoException{
		throw new NoSePuedeAprobarPrestamoException("No se puede aprobar un prestamo que no este solicitado");
	}
	
	
	public boolean estaSolicitado(){
		return false;
	}
	
	public boolean estaEnCurso(){
		return false;
	}
	
	public boolean estaRechazado(){
		return false;
	}
	
	public boolean estaEnDeuda(){
		return false;
	}
	
	public boolean estaEnDeudaIncobrable(){
		return false;
	}
	
	public boolean estaFinalizado(){
		return false;
	}
	
	public boolean estaActivo() {
		return false;
	}

	/**@param prestamo
	* @return true si el prestamo tiene cuotas impagas
	*/
	public boolean adeudaCuotas(Prestamo prestamo) {
		return false;
	}

	
		
}
